<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fn="http://www.w3.org/2005/xpath-functions">
	
	<xsl:output method="text"
				encoding="utf-8"
				omit-xml-declaration="yes"
				indent="no"
				media-type="text/javascript"/>
	
	<xsl:variable name="fx">library://solarcore/fx</xsl:variable>

	<xsl:template match="/*">
		{$self} = solarcore.declareClass("<xsl:call-template name="resolveNS"/>", function (){
			this.htmlId = new Date ().getTime();
		<xsl:apply-templates select="child::node()" />
		});
	</xsl:template>
	
	<xsl:template match="*"><xsl:param name="isNested">false</xsl:param><xsl:choose>
		<xsl:when test="(namespace-uri(.)=$fx) and (local-name(.)='html')"><xsl:call-template name="html"/></xsl:when>
		<xsl:when test="(namespace-uri(.)=$fx) and (local-name(.)='import')"></xsl:when>
		<xsl:when test="(namespace-uri(.)=$fx) and (local-name(.)='script')"><xsl:call-template name="script"/></xsl:when>
		<xsl:otherwise><xsl:call-template name="component"><xsl:with-param name="isNested" select="$isNested"/></xsl:call-template></xsl:otherwise>
	</xsl:choose></xsl:template>
	
	<xsl:template match="*" mode="html"><xsl:call-template name="openTag"/><xsl:apply-templates select="child::node()" mode="html" /><xsl:call-template name="closeTag"/></xsl:template>
	
	<xsl:template match="@*" mode="html">&#160;<xsl:value-of select="name(.)"/>=\"<xsl:value-of select="."/><xsl:if test="name(.)='id'">_", this.htmlId, "</xsl:if>\"</xsl:template>
	
	<xsl:template match="@*" mode="property">'<xsl:value-of select="name(.)"/>':"<xsl:value-of select="."/>",</xsl:template>
	
	<xsl:template name="component"><xsl:param name="isNested">true</xsl:param>
		<xsl:if test="$isNested!='true'">this.component(</xsl:if>{
			'classURI':"<xsl:call-template name="resolveNS"/>",
			'properties':{<xsl:apply-templates select="@*" mode="property"/>'_eop':null},
			'children':[<xsl:apply-templates select="child::node()"><xsl:with-param name="isNested">true</xsl:with-param></xsl:apply-templates>]
		}<xsl:if test="$isNested!='true'">);</xsl:if>
	</xsl:template>
	
	<xsl:template name="html">this.html([<xsl:apply-templates select="child::node()" mode="html" />""].join(''));</xsl:template>
	
	<xsl:template name="resolveNS"><xsl:value-of select="namespace-uri(.)" />/<xsl:value-of select="local-name(.)" /></xsl:template>

	<xsl:template name="script"><xsl:value-of select="."/></xsl:template>
	
	<xsl:template name="openTag">"&lt;<xsl:value-of select="local-name(.)"/><xsl:apply-templates select="@*" mode="html"/>&gt;",</xsl:template>
	<xsl:template name="closeTag">"&lt;/<xsl:value-of select="local-name(.)"/>&gt;",</xsl:template>
</xsl:stylesheet>